module Display 
(
    input  logic        clk_scan,     // 1kHz扫描时钟
    input  logic        rst,        // 高电平复位
    input  logic        en,         // 模块使能
    input  logic [4:0]  data [0:7], // 显示数据（0左→7右）
    input  logic [7:0]  decimal,    // 小数点控制（bit0左→bit7右）
    output logic [7:0]  seg_sel,    // 位选（低有效，bit0左→bit7右）
    output logic [7:0]  seg_data    // 段码（低有效，dp+gfedcba）
);

logic [2:0] scan_cnt;  // 扫描计数器（0-7循环）

// 段码映射函数
function automatic logic [6:0] seg_map(input [4:0] code);
    case(code)
        5'd0:  return 7'b1000000;   // 数字0-9
        5'd1:  return 7'b1111001;   5'd2:  return 7'b0100100;
        5'd3:  return 7'b0110000;   5'd4:  return 7'b0011001;
        5'd5:  return 7'b0010010;   5'd6:  return 7'b0000010;
        5'd7:  return 7'b1111000;   5'd8:  return 7'b0000000;
        5'd9:  return 7'b0010000;
        5'd10: return 7'b0001000;   // A
        5'd11: return 7'b0000011;   // b
        5'd12: return 7'b1000110;   // C
        5'd13: return 7'b0100001;   // d
        5'd14: return 7'b0000110;   // E
        5'd15: return 7'b0001110;   // F
        5'd16: return 7'b0001100;   // P
        5'd17: return 7'b1000001;   // U
        5'd18: return 7'b0010001;   // Y
        5'd19: return 7'b1111100;   // L
        5'd20: return 7'b0000000;   // 全亮
        5'd21: return 7'b1111111;   // 全灭
        5'd22: return 7'b0111111;   // -
        default:return 7'b1111111;  // 默认全灭
    endcase
endfunction

// 扫描计数与输出生成
always_ff @(posedge clk_scan or posedge rst) begin
    if (rst) begin
        scan_cnt <= 3'd0;
        seg_sel  <= 8'hFF;        // 复位全灭
        seg_data <= 8'hFF;
    end else if (en) begin
        scan_cnt <= scan_cnt + 1;  // 自动循环计数
        seg_sel  <= ~(8'h01 << scan_cnt);          // 动态位选
        seg_data <= {~decimal[scan_cnt], seg_map(data[scan_cnt])}; // 组合段码
    end else begin
        seg_sel  <= seg_sel;      // 冻结显示
        seg_data <= seg_data;
    end
end

endmodule